minMatrix.js : lookAt
構文 : matIV.lookAt(eye, center, up, dest)
引数 : eye > カメラの位置を表すベクトル
引数 : center > カメラの注視点を表すベクトル
引数 : up > カメラの上方向を表すベクトル
引数 : dest > 演算結果を格納する行列
ビュー変換行列を生成します。eye にカメラの三次元空間上の位置を指定し、center はそのカメラが見つめる注視点を指定します。up にはカメラの上方向を表すベクトルを与えます。各ベクトルは三つの要素を持つ配列として渡します。演算結果は dest に出力されます。 code:js
this.lookAt = function(eye, center, up, dest){
var eyeX = eye0, eyeY = eye1, eyeZ = eye2, upX = up0, upY = up1, upZ = up2, centerX = center0, centerY = center1, centerZ = center2; if(eyeX == centerX && eyeY == centerY && eyeZ == centerZ){return this.identity(dest);}
var x0, x1, x2, y0, y1, y2, z0, z1, z2, l;
z0 = eyeX - center0; z1 = eyeY - center1; z2 = eyeZ - center2; l = 1 / Math.sqrt(z0 * z0 + z1 * z1 + z2 * z2);
z0 *= l; z1 *= l; z2 *= l;
x0 = upY * z2 - upZ * z1;
x1 = upZ * z0 - upX * z2;
x2 = upX * z1 - upY * z0;
l = Math.sqrt(x0 * x0 + x1 * x1 + x2 * x2);
if(!l){
x0 = 0; x1 = 0; x2 = 0;
} else {
l = 1 / l;
x0 *= l; x1 *= l; x2 *= l;
}
y0 = z1 * x2 - z2 * x1; y1 = z2 * x0 - z0 * x2; y2 = z0 * x1 - z1 * x0;
l = Math.sqrt(y0 * y0 + y1 * y1 + y2 * y2);
if(!l){
y0 = 0; y1 = 0; y2 = 0;
} else {
l = 1 / l;
y0 *= l; y1 *= l; y2 *= l;
}
dest0 = x0; dest1 = y0; dest2 = z0; dest3 = 0; dest4 = x1; dest5 = y1; dest6 = z1; dest7 = 0; dest8 = x2; dest9 = y2; dest10 = z2; dest11 = 0; dest12 = -(x0 * eyeX + x1 * eyeY + x2 * eyeZ); dest13 = -(y0 * eyeX + y1 * eyeY + y2 * eyeZ); dest14 = -(z0 * eyeX + z1 * eyeY + z2 * eyeZ); return dest;
};